package gdupt.stack;

import java.util.Arrays;

/**
 * E代表可以使用泛型数据
 *
 * @author zhn
 * @param <E>
 */
public class OperationStack<E> {
    /**
     * 栈顶位置
     */
    int top;
    int maxL;
    Object[] strArr;

    /**
     * 构造方法
     */
    public OperationStack() {
        //默认长度为10
        maxL = 10;
        top = -1;
        strArr = new Object[maxL];
    }

    /**
     * 进栈操作
     *
     * @param str
     */
    public void push(E str) {
        //自动扩容
        if (top + 1 >= maxL) {
            //如果进栈数据数量超过数组长度，自动扩容 ,扩容1.5倍
            strArr = Arrays.copyOf(strArr, maxL + (maxL >> 1));
        }
        strArr[++top] = str;
    }

    /**
     * 出栈操作
     *
     * @return
     */
    public E pop() {
        E spop = (E) strArr[top];
        strArr[top] = null;
        top--;
        return spop;
    }

    /**
     * 访问栈顶元素
     *
     * @return
     */
    public E top() {
        return (E) strArr[top];
    }

    /**
     * 栈的大小
     *
     * @return
     */
    public int stackSize() {
        return top + 1;
    }

    /**
     * 栈是否为空
     *
     * @return
     */
    public boolean empty() {
        return top == -1;
    }

}
